/**
 *
 * HashTable
 */
function HashTable() {
	//  为什么定义数组长度为137，请看数据结构与算法 javascript 描述.pdf P88
	this.table = new Array(137);
	this.simpleHash = simpleHash;  // 普通散列函数，碰撞几率大
	this.genHashCodeV2 = genHashCodeV2;  //加强版散列函数
	this.showDistro = showDistro;
	this.put = put;
	this.get = get;
}

/**
 * 散列函数
 * 将字符串中每个字符的 ASCII 码值相加似乎是一个不错的散列函数。
 * 这样散列值就是 ASCII 码值的和除以数组长度的余数
 * 本散列函数发生碰撞的机会很大，需要设计更好的散列函数
 */
function simpleHash(data) {
	var total = 0;
	for (var i = 0; i < data.length; i++) {
		total += data.charCodeAt(i);
	}

	return total % this.table.length;
}

/**
 * 比第一个版本更好的散列函数
 * 详情请看 《数据结构与算法 javascript 描述.pdf》P91
 */
function genHashCodeV2(data) {
	const hcode = 37;
	var total = 0;
	for (var i = 0; i < data.length; i++) {
		total += total + data.charCodeAt(i);
	}
	total = total % this.table.length;
	return parseInt(total);
}

function put(data) {
	var pos = this.genHashCodeV2(data);  //得到散列值作为键
	this.table[pos] = data;
}

function showDistro() {
	// var n = 0;
	// print("table length = " + this.table.length);
	for (var i = 0; i < this.table.length; i++) {
		// print("i = " + i);
		if (typeof(this.table[i]) != 'undefined') {
			print(i + " ：" + this.table[i]);
		}
	}
}

/**
 * 后续完善
 */
function get() {
	var pos = this.genHashCodeV2(data);
	return this.table[pos];
}




